package com.siwei.mes.service.experiment;

import com.github.pagehelper.PageInfo;
import com.siwei.mes.common.query.PageQuery;
import com.siwei.mes.entity.ShxhSynchronizedata;
import com.siwei.mes.entity.erp.Itemorder;
import com.siwei.mes.entity.erp.Rwdextra;
import com.siwei.mes.entity.experiment.Experiment;
import com.siwei.mes.entity.order.Order;
import com.siwei.mes.entity.sync.tc.Waybill;
import com.siwei.mes.entity.vo.CreateMaterialsExperimentVo;
import com.siwei.mes.entity.vo.ExperimentBatchVo;
import com.siwei.mes.entity.vo.ExperimentVo;
import com.siwei.mes.enums.EnturstReasonEnum;

import java.util.List;
import java.util.Set;

/**
 * 试验台账(Experiment)表服务接口
 *
 * @author linzi
 * @since 2023-12-18 22:11:47
 */
public interface ExperimentService {

    /**
     * 新增混凝土试验委托
     *
     * @param entity
     * @return
     */
    Long createConcrete(Experiment entity);

    /**
     * 新增原材料
     *
     * @param entity
     * @return
     */
    Long createRawMaterials(Experiment entity);

    /**
     * 修改
     *
     * @param entity
     */
    Experiment update(Experiment entity);

    /**
     * 删除
     *
     * @param id
     */
    void delete(Long id);

    /**
     * 获取所有分组  分页
     *
     * @param query
     * @return
     */
    PageInfo<Experiment> getPage(PageQuery<Experiment, Experiment> query);

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    Experiment loadById(Long id);

    /**
     * 获取所有
     *
     * @param entity
     * @return
     */
    List<Experiment> getAll(Experiment entity);

    /**
     * 接收
     *
     * @param id
     * @param isCheckRole 是否权限校验
     */
    Experiment accept(Long id, boolean isCheckRole);

    /**
     * 完成
     *
     * @param id
     */
    Experiment finish(Long id);

    /**
     * 拒绝
     *
     * @param id
     */
    void refuse(Long id);

    /**
     * 根据小票信息生成试验台账
     *
     * @param entity              erp小票信息
     * @param checkType           1-快检 2-批检
     * @param entrustExperiment   委托试验
     * @param testProjectCodeList 试验项目集合
     * @return
     */
    Experiment getExperimentInfoByItemOrderInfo(Itemorder entity, Integer checkType, String entrustExperiment, Set<String> testProjectCodeList);

    /**
     * 获取最新的总数据
     *
     * @param entity
     * @return
     */
    int getAllCount(Experiment entity);

    /**
     * 根据任务信息生成使用台账
     *
     * @param rwdextra          erp任务单信息
     * @param checkType         1-快检 2-批检
     * @param enturstReasonEnum 委托类型枚举
     * @return
     */
    Experiment getExperimentInfoByRwdextraToOrder(Rwdextra rwdextra, Integer checkType, EnturstReasonEnum enturstReasonEnum, Order entity);

    //生成配合比试验台账
    Experiment getExperimentInfo(Integer checkType, EnturstReasonEnum enturstReasonEnum, String ypdj, String entrustExperiment, Set<String> testProjectCodeList);

    /**
     * 根据砼材运单信息生成试验台账
     *
     * @param entity
     * @param checkType           1-快检 2-批检
     * @param entrustExperiment   委托试验
     * @param experimentType      委托类型
     * @param testProjectCodeList 试验项目集合
     * @return
     */
    Experiment getExperimentInfoByWaybillInfo(Waybill entity, Integer checkType, String entrustExperiment, Integer experimentType, Set<String> testProjectCodeList);

    /**
     * 组装其它信息  试验依据、判断依据、仪器设备、最后一条含水率配置
     *
     * @param experiment          试验委托信息
     * @param testProjectCodeList 试验项目集合
     */
    void payloadOtherInfo(Experiment experiment, Set<String> testProjectCodeList);

    /**
     * 实验台账保存任务信息
     *
     * @param vo
     */
    void bindExperimentItemOrder(ExperimentVo vo);

    /**
     * 实验台账保存采购信息
     *
     * @param vo
     */
    void saveExperimentWaybill(ExperimentVo vo);

    /**
     * 修改仪器设备信息
     */
    void updateEquipmentInfo();

    /**
     * 批量修改实验台帐批次
     */
    void updateBatchByIds(ExperimentBatchVo vo);

    void createMaterialsExperiment(CreateMaterialsExperimentVo createMaterialsExperimentVo);

    /**
     * 批量修改实验,根据材料规格和材料名称修改物料名称和物料规格
     */
    void updateBatchExperimentMatter();

    /**
     * 批量修改实验,根据材料规格和材料名称修改物料名称和物料规格
     */
    void updateBatchExperimentReportNo();

    /**
     * 批量修改实验,补全是否甲供字段
     */
    void updateBatchExperimentSelfSupply();

    /**
     * 修改实验 是否甲供字段
     */
    void updateBatchExperiment(Experiment experiment);

    /**
     * 保存协会相关信息
     *
     * @param entity
     */
    void submitShxhSynchronizedata(ShxhSynchronizedata entity);

    void generateReport(Long id);

    /**
     * 撤销上传
     *
     * @param id
     * @return
     */
    void revokeUpload(Long id);

    /**
     * 已读新任务单
     *
     * @param id 试验台账id
     */
    void viewNewTask(Long id);
}
